From 74c6dc2d0ac4dcab0c6243cdf6ed550c1532b798 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 22 Jun 2016 11:58:31 +0200 Subject: [PATCH] x86/vMSI-X: defer intercept handler registration There's no point in registering the internal MSI-X table intercept functions on all domains - it is sufficient to do so once a domain gets an MSI-X capable device assigned. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/hvm/hvm.c | 2 -- xen/arch/x86/hvm/vmsi.c | 5 +++-- xen/drivers/passthrough/pci.c | 3 +++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index ffc3395ccc..5d6b921821 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -644,8 +644,6 @@ int hvm_domain_initialise(struct domain *d) rtc_init(d); - msixtbl_init(d); - register_portio_handler(d, 0xe9, 1, hvm_print_line); if ( hvm_tsc_scaling_supported ) diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index 0066be565c..81e45c8b7a 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -553,7 +553,8 @@ found: void msixtbl_init(struct domain *d) { - if ( !has_vlapic(d) ) + if ( !has_hvm_container_domain(d) || !has_vlapic(d) || + d->arch.hvm_domain.msixtbl_list.next ) return; INIT_LIST_HEAD(&d->arch.hvm_domain.msixtbl_list); @@ -567,7 +568,7 @@ void msixtbl_pt_cleanup(struct domain *d) struct msixtbl_entry *entry, *temp; unsigned long flags; - if ( !has_vlapic(d) ) + if ( !d->arch.hvm_domain.msixtbl_list.next ) return; /* msixtbl_list_lock must be acquired with irq_disabled for check_lock() */ diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 98936f55cb..bb5f344878 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -1380,6 +1380,9 @@ static int assign_device(struct domain *d, u16 seg, u8 bus, u8 devfn, u32 flag) goto done; } + if ( pdev->msix ) + msixtbl_init(d); + pdev->fault.count = 0; if ( (rc = hd->platform_ops->assign_device(d, devfn, pci_to_dev(pdev), flag)) ) -- 2.30.2